package scope;

/**
 * @Author Stringzhua
 * @Date 2024/2/29 11:59
 * description:作用域使用细节
 * 细节4:作用域范围不同
 * 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
 * 局部变量:只能在本类中对应的方法中使用
 * 细节5:修饰符不同
 * 全局变量/属性可以加修饰符
 * 局部变量不可以加修饰符
 */
public class varscopedetail {
    public static void main(String[] args) {
        Person p1 = new Person();
        /*
        * 细节3:属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
        * 局部变量生命周期比较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁.(即在一次方法调用过程中)
        * */
        p1.say();//当执行say方法时,say方法的局部变量比如name,会创建
        // 当say执行完毕后,局部变量就销毁,但属性是全局变量,仍然可以使用.
        T t1 = new T();
        t1.test();//第一种跨类访问对象属性的方式

        t1.test2(p1);//第二种跨类访问对象属性的方式
    }
}
class T{
    public void test(){
        Person p1 = new Person();
        System.out.println(p1.name);//jack
    }
    public void test2(Person p){
        System.out.println(p.name);//jack
    }
}

class Person {
    //细节:属性可以加修饰符(public protected private)
    public int age=20;
    //局部变量不可以加修饰符
    String name = "jack";

    public void say() {
        //细节1：属性和局部变量可以重名,访问时遵循就近原则
        //public String name="king";//错误，非法的表达式开始
        String name = "king";
        System.out.println("say() name=" + name);
    }

    public void hi() {
        //细节2:在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名
        String address = "北京";
//      String address = "上海";//错误,重复定义变量
        String name="Stringzhua";//可以
    }
}